﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;

namespace Gruppe1OOPEksamen {

    class Program {
        static void Main(string[] args) {

            #region tjek data klasser
            Kondenstørretumbler t1 = new Kondenstørretumbler(84.2, 59.8, 62.5, 7, 0.416, "Bosch", 3998, 100, 60, true);
            Aftrækstørretumbler t2 = new Aftrækstørretumbler(85, 60, 60, 6, 0.611, "AEG", 3799, 100, 60, true);
            Mikroovn o1 = new Mikroovn(30.50, 50.5, 51, 25, 0.69, "Kenwood", 999, true, true);
            IndbygningsOvn o2 = new IndbygningsOvn(59.40, 56.70, 59.40, 74, 0.97, "Voss", 3999, true);
            IndbygningsOvn o3 = new IndbygningsOvn(49.40, 46.70, 49.40, 64, 0.87, "HTH", 4999, true);
            Emhætte e1 = new Emhætte("Frihængt", 78, 600, true, 15000, "Miele");
            

            Console.WriteLine(t1.ToString() + "\n");
            Console.WriteLine(t2.ToString() + "\n");
            Console.WriteLine(o1.ToString() + "\n");
            Console.WriteLine(o2.ToString() + "\n");
            Console.WriteLine(e1.ToString() + "\n");

            #endregion
            Console.WriteLine("****Testede data klasser");
            Console.ReadLine();

            #region test exceptions!
            try {
                Emhætte fejlet1 = new Emhætte("asdasd", 78, 600, true, 15000, "Miele");
            }
            catch (ArgumentException e) {
                Console.WriteLine("Emhætte type exception: \n" + e.Message);
            }

            try {
                Emhætte fejlet1 = new Emhætte("Frihængt", 78, 600, true, 15000, "");
            }
            catch (ArgumentNullException e) {
                Console.WriteLine("\nVare navn exception: \n" + e.Message);
            }
            try {
                Emhætte fejlet1 = new Emhætte("Frihængt", 78, 600, true, -123, "Miele");
            }
            catch (ArgumentOutOfRangeException e) {
                Console.WriteLine("\nVare pris exception: \n" + e.Message);
            }
            #endregion
            Console.WriteLine("****Testede exceptions");
            Console.ReadLine();

            #region kollektion klasse
            VareKollektion Varer = new VareKollektion(new VareTæller(8, 2, t1), new VareTæller(12, 3, t2), new VareTæller(4, 1, o1), new VareTæller(6, 0, o2), new VareTæller(4, 1, o3), new VareTæller(9, 5, e1));
            Varer.Tilføj(t1, 3); //skulle være 11 t1
            Varer.Fjern(t1, 2); //skulle være 9
            Varer.Tilføj(o1); //Skulle være 5
            Varer.Fjern(o1); //skulle være 4

            Varer.UdskrivAntalVare();
            #endregion

            Console.WriteLine("****Testede kollektion klasse");
            Console.ReadLine();


            #region tjek event
            Varer.Fjern(t2, 11); //forventet 13
            Varer.Fjern(t2, 12); //forventet 13

            #endregion

            Console.WriteLine("****Testede eventet");
            Console.ReadLine();

            #region tjek søgefunktioner
            Console.WriteLine("Søger på vare med navn \"Bosch\":\n");
            foreach (Vare v in Varer.FindVareNavn("Bosch")) Console.WriteLine(v.Navn + " " + v.Pris + "\n");

            Console.WriteLine("Søger på vare mellem 3500 og 3998:\n");
            foreach (Vare v in Varer.FindPrisklasse(3500, 3998)) Console.WriteLine(v.Navn + " " + v.Pris + "\n");
            

            foreach (Vare v in Varer.FindSmiley("Glad"))
            {
                string smiley = (string)HentSubKlasseVærdi(v, "Smiley");
                Console.WriteLine(v.Navn + ". Har en " + smiley + " smiley og koster " + v.Pris);                
            }
             
            foreach (Tørretumbler v in Varer.FindEnergimærke('B')) Console.WriteLine(v.Navn + " " + v.Pris + "\n");

            #endregion

            Console.WriteLine("****Testede kollektion klassens søgefunktioner");
            Console.ReadLine();

            #region test Enumerators
            foreach (VareTæller v in Varer.HentNedtællendeEnumerator()) Console.WriteLine(v.VareAtTjekke.ToString() + "\nAntal: " + v.AntalVare + "\n");

            Console.WriteLine("____________ Udskrev nedtællende Enumerator");

            foreach (VareTæller v in Varer.HentOptællendeEnumerator()) Console.WriteLine(v.VareAtTjekke.ToString() + "\nAntal: " + v.AntalVare + "\n");
            #endregion


            Console.WriteLine("****Testede kollektion klassens enumeratores");
            Console.ReadLine();
         }

        public static object HentSubKlasseVærdi(object ind, string propertiNavn) {
            Type t = ind.GetType(); //finder typen af objectet ind
            PropertyInfo propInfo = t.GetProperty(propertiNavn); //henter propertien "Smiley"
            object s = propInfo.GetValue(ind, null); //finder værdien af "Smiley" i instancen af ind
            
            return s;
        }

    }
}
